'''
Created on 12/06/2010

@author: kivson
'''
import array
import binario
class Esconde(object):
    '''
    Classe Esconde, responsavem por esconder a mensagem na figura.
    '''
    ''' 
    Cabecalho eh onde fica a quantidade de bytes que esta escondida na imagem
    sendo armazenado um interio de 32 bits
    '''
    TAMANHOCABECALHO = 8*4

    def __init__(self, bytes, arquivo):
        '''
        Constructor
        '''
        self._imgBytes = bytes
        self._arquivo = file(arquivo)
        self.binConvert = binario.ConverteBin()
        
        self._arqBytes = array.array('c')
        self._arqBytes.extend(self._arquivo.read())
        self._tamanhoArquivo = len(self._arqBytes)
        
    def verificaPossibilidade(self):
        if len(self._imgBytes) * 3 < self._tamanhoArquivo *8 + self.TAMANHOCABECALHO:
            print "Erro: arquivo a ser escondido muito grande para a imagem"
    
    def iterImgBytes(self):
        for rgb in self._imgBytes:
            yield rgb
                
    def getCabecalhoBin(self,dados):
        tamBim = self.binConvert.toBin(self._tamanhoArquivo)
        
        dados.extend( [0]*(self.TAMANHOCABECALHO-len(tamBim)))
        dados.extend (tamBim)
    
    def getArqBin(self, dados):
        
        for byte in self._arqBytes:
            #print byte
            dados.extend(self.binConvert.toBin(ord(byte)))
            #print self.binConvert.toBin(ord(byte))
    
    
    def escreve(self):
        dados = array.array('B')
        '''pega as informacoes do cabecalho e do arquivo em binario e poe dentro de dados'''
        self.getCabecalhoBin(dados)

        self.getArqBin(dados)
        '''cria um novo vertor de RGB's para a imagem nova'''
        self._novaImgBytes = []
        i = 0
        for rgb in self._imgBytes:
            cores = []
            for cor in rgb:
                if i < len(dados):
                    if dados[i]:
                        cores.append(cor | (dados[i]))
                    else:
                        cores.append(cor & (254 + dados[i]))
                    i += 1
                else:
                    cores.append(cor)
            self._novaImgBytes.append(tuple(cores))
        
    
    def run(self):
        self.verificaPossibilidade()
        self.escreve()
        



if __name__ == "__main__":
    import Image
    fig = Image.open('../yoda.jpg')
    data = fig.getdata()
    arquivo = '../teste'
    esc = Esconde(data, arquivo)
    ##print list(esc._imgBytes)
    esc.run()
    #print list(esc._novaImgBytes)
    fig2 = Image.new('RGB',fig.size)
    fig2.putdata(esc._novaImgBytes)
    fig.show()
    fig2.show()